#include <logbase.h>

// 第1优先级：各种括号，如()、[]等、成员运算符 . ；
// 第2优先级：所有单目运算符，如++(自加)、--(自减)、!(非)、~(位非)等；
// 第3优先级：乘法运算符*、除法运算符/、求余运算符%；
// 第4优先级：加法运算符+、减法运算符-；
// 第5优先级：移位运算符<<、>>；
// 第6优先级：大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=；
// 第7优先级：等于运算符==、不等于运算符!=；
// 第8优先级：按位与运算符&；
// 第9优先级：按位异或运算符^；
// 第10优先级：按位或运算符|；
// 第11优先级：逻辑与运算符&&；
// 第12优先级：逻辑或运算符||；
// 第13优先级：三目条件运算符 ?: ；
// 第14优先级：各种赋值运算符，如=、+=、-=、*=、/= 等；
// 第15优先级：逗号运算, 。

// 比如 int a = -2 + 1 << 1;应该是多少。
// int b = (3 & 2 == 2);应该是多少。
// 法则就一条，加括号。括号最高

#define SWAP_VAL(a, b) (a ^= b, b ^= a, a ^= b)

int main(int argc, char **argv)
{
    {
        uint32_t a, b;
        a = 10;
        b = 22;
        logdebugc("origin : a=%d, b=%d", a, b);
        a ^= b; // a = a ^ b;q
        b ^= a; // b = a ^ b;
        a ^= b; // a = a ^ b;
        logdebugc("swap : a=%d, b=%d", a, b);
        SWAP_VAL(a, b);
        logdebugc("swap pro : a=%d, b=%d", a, b);
        logdebugc("swap val = %d", SWAP_VAL(a, b));
    }
    {
#define testStrSize 5
        uint8_t enca = 0xa5, encb = 53;
        uint8_t originstr[testStrSize];
        uint8_t encstr[testStrSize];
        uint8_t dncstr[testStrSize];
        for (int i = 0; i < testStrSize; i++)
        {
            originstr[i] = i;
            logdebugc("origin id[%d],val=0x%02x", i, originstr[i]);
        }
        // encrypte
        for (int i = 0; i < testStrSize; i++)
        {
            encstr[i] = (originstr[i] ^ enca) + encb;
            logdebugc("encrypte id[%d],enc=0x%02x", i, encstr[i]);
        }
        // decrypte
        for (int i = 0; i < testStrSize; i++)
        {
            dncstr[i] = (encstr[i] - encb) ^ enca;
            logdebugc("decrypte id[%d],enc=0x%02x", i, dncstr[i]);
        }
    }
    // 加密算法有DES,DES3,AES,RSA,SM2，SM4等。
    // 不可逆,校验码：MD5,SHA256,SM3
    return 1;
}
